Podsumowanie wyników

Raport z przedmiotu Zaawansowana Eksploracja Danych.

1. Ładowanie bibliotek:

library(DT)
library(dplyr)
library(ggplot2)
library(plotly)
library(reshape2)
library(plotly)
# Pretty Table
#knitr::opts_chunk$set(echo = TRUE)

prettyTable <- function(table_df, round_columns=numeric(), round_digits=2) {
  DT::datatable(table_df, style="bootstrap", filter = "top", rownames = FALSE, extensions = "Buttons", options = list(dom = 'Bfrtip', buttons = c('copy', 'csv', 'excel', 'pdf', 'print'))) %>%
    formatRound(round_columns, round_digits)
}

2. Załadowanie danych

W celu załadowania należy upewnić się, że plik z danymi all_summary.csv znajduje się w folderze data, lub zmienić ścieżkę docelową poniżej.

my_data <-read.csv(file='./data/all_summary.csv', sep = ";", 
                   header = TRUE, stringsAsFactors = FALSE,nrow = 1000)

3. Podsumowanie danych

str(my_data)
summary(my_data)
head(my_data)

3.Kod usuwający z danych wiersze posiadające wartość zmiennej res_name równą:

“UNK”, “UNX”, “UNL”, “DUM”, “N”, “BLOB”, “ALA”, “ARG”, “ASN”, “ASP”, “CYS”, “GLN”, “GLU”, “GLY”, “HIS”, “ILE”, “LEU”, “LYS”, “MET”, “MSE”, “PHE”, “PRO”,“SEC”, “SER”, “THR”, “TRP”, “TYR”, “VAL”, “DA”, “DG”, “DT”, “DC”, “DU”, “A”, “G”, “T”, “C”, “U”, “HOH”, “H20”, “WAT”

my_data_skip <- my_data[ ! my_data$res_name %in% c('UNK', 'UNX', 'UNL', 'DUM', 'N', 'BLOB', 'ALA', 'ARG', 'ASN', 'ASP', 'CYS', 'GLN','GLU', 'GLY', 'HIS', 'ILE', 'LEU', 'LYS', 'MET', 'MSE', 'PHE', 'PRO', 'SEC', 'SER','THR', 'TRP', 'TYR', 'VAL', 'DA', 'DG', 'DT', 'DC', 'DU', 'A', 'G', 'T', 'C', 'U', 'HOH', 'H20', 'WAT'), ]

4. Istotne kolumny z danymi.

Tworzę osobną zmienną do przetrzymywania istotnych kolumn; tj. column z pkt. poprzedniego, kolumny res_name oraz innych zawartych w zadaniach z ćwiczenia.

rest_col <- c('res_name','local_res_atom_non_h_count','local_res_atom_non_h_electron_sum',
             'dict_atom_non_h_count','local_res_atom_non_h_electron_sum',
              'dict_atom_non_h_electron_sum','local_volume','local_electrons','local_mean','local_std','local_min','local_max','local_skewness')

5. Zostaw tylko te dane, których kolumna zawiera ‘part_’

Przypisuję te kolumny do zmiennej my_data_skip_col. Dodatkowo sprawdzam, które w kolejności to kolumny

my_data_skip_col <- my_data_skip[ , grepl( "part_" , names( my_data_skip ) ) ]
grepl( "part_" , names( my_data_skip ) )
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [34] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [45] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [89]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [100]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [111]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [122]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [133]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [144]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [155]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [166]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [177]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [188]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [199]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [210]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [221]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [232]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [243]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [254]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [265]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [276]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [287]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [298]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [309]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [320]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [331]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [342]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [353]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [364]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [375]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [386]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [397] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [408] FALSE FALSE  TRUE  TRUE  TRUE

Dane po wyborze wyselekcjonowanych kolumnam:

res_name, part_ (c(79:396),c(410:412)) oraz rest_col

select_col <- my_data_skip %>% select('res_name',c(79:396),c(410:412),rest_col)

Oczyszczanie danych z wartości NA

Liczba wierszy przed oczyszczeniem:

#liczba col, przed pozbyciem się niepełnych danych
nrow(select_col)
## [1] 1000

Kod przetwarzający brakujące dane.

Utworzona zostaje nowa zmienna: select_colno_NA

#lprzetwarzanie wartośći NA
select_colno_NA <- select_col[complete.cases(select_col), ]

Liczba kolumn po oczyszczeniem:

#liczba col, przed pozbyciem się niepełnych danych
nrow(select_colno_NA)
## [1] 882

Podsumowanie obecnego zbioru:

Funkcja summary, head, nrow, ncol, oraz str

#Sekcję podsumowującą rozmiar zbioru i podstawowe statystyki.
summary(select_colno_NA)
head(select_colno_NA, 10)
nrow(select_colno_NA)
ncol(select_colno_NA)
str(select_colno_NA)

Kod ograniczający liczbę klas (res_name) do 50 najpopularniejszych wartości. pkt 7

Utworzona zostaje nowa zmienna: res_name_50

# Korzystam z biblioteki dplr
res_name_50 <- select_colno_NA %>% 
  group_by(res_name) %>% 
  summarise(SUM = n())  %>% arrange(desc(SUM)) %>% select(res_name)

res_name_50 <- head(res_name_50, 50)

Tworzę selekcję danych. Tylko te z 50-cioma najpopularniejszymi klasami. Do tego celu tworzę zmienną: strvariable

# Przypisanie do zmiennej strvariable wartości res_name_50, w celu późniejszego użycia
strvariable <- ''
for(i in res_name_50){strvariable <- paste(i)}
strvariable

Kod z danymi tylko 50 najpopularniejszych klas:

# Wykorzystanie zmiennej strvariable
only50class <- select_colno_NA[ select_colno_NA$res_name %in% c(strvariable), ]
  
only50class %>% group_by(res_name) %>% 
  summarise(SUM = n())  %>% arrange(desc(SUM)) %>% select(res_name, SUM)
## # A tibble: 50 x 2
##    res_name   SUM
##    <chr>    <int>
##  1 SO4        109
##  2 HEM         73
##  3 GOL         61
##  4 NAG         48
##  5 ZN          40
##  6 MG          28
##  7 MLY         28
##  8 CD          24
##  9 K           23
## 10 CA          21
## # ... with 40 more rows
# Liczba kolumn została zmniejszona poprzez wyelminowanie niepowatarzających się rzadkich ligandów
nrow(only50class)
## [1] 739

Pkt 8. Sekcję sprawdzającą korelacje między zmiennymi;

Sekcja ta powinna zawierać jakąś formę graficznej prezentacji korelacji.

head(only50class, 50)
summary(only50class)
str(only50class)
# Wybranie tylko column numerycznych 
nums <- unlist(lapply(only50class, is.numeric))  
# Utworzenie nowej zmiennej
only50class_num <- only50class[ , nums]
# Analiza danych
str(only50class_num)

#Korelacja między zmiennymi (Ze względu na ogromną liczbę kolumn, dodatkowo ograniczam wynik do col od 2 do 8)
cormat <- round(cor(only50class_num[,c(2:8)]),8)
head(cormat)


melted_cormat <- melt(cormat)
head(melted_cormat)
ggplot(data = melted_cormat, aes(x=Var1, y=Var2, fill=value)) + 
  geom_tile()

9 Określenie ile przykładów ma każda z klas (res_name).

only50class %>% group_by(res_name) %>% 
  summarise(SUM = n())  %>% arrange(desc(SUM)) %>% select(res_name, SUM)
## # A tibble: 50 x 2
##    res_name   SUM
##    <chr>    <int>
##  1 SO4        109
##  2 HEM         73
##  3 GOL         61
##  4 NAG         48
##  5 ZN          40
##  6 MG          28
##  7 MLY         28
##  8 CD          24
##  9 K           23
## 10 CA          21
## # ... with 40 more rows

10 Wykresy rozkładów liczby atomów:

(local_res_atom_non_h_count) i elektronów (local_res_atom_non_h_electron_sum). W zadaniu zawarty został także pkt. 13 Interaktywny wykres lub animację.

only50class_grby <- only50class %>%
  group_by(local_res_atom_non_h_electron_sum)   %>% 
summarise(SUM = n())  %>% select(local_res_atom_non_h_electron_sum, SUM)
       

p <- ggplot(only50class_grby, aes(SUM, local_res_atom_non_h_electron_sum)) + 
  geom_point()
ggplotly(p)
only50class_grby_at <- only50class %>%
  group_by(local_res_atom_non_h_count)   %>% 
  summarise(SUM = n())  %>% select(local_res_atom_non_h_count, SUM)


p <- ggplot(only50class_grby_at, aes(SUM, local_res_atom_non_h_count)) + 
  geom_point()
ggplotly(p)

Podsumowanie: Najwięcej danych bo około 193 ma wartość zmiennej local_res_atom_non_h_count równą 1.

12 Tabelę pokazującą 10 klas z największą niezgodnością liczby atomów

(local_res_atom_non_h_count vs dict_atom_non_h_count) i tabelę pokazującą 10 klas z największą niezgodnością liczby elektronów (local_res_atom_non_h_electron_sum vs dict_atom_non_h_electron_sum;)

local_res_atom_non_h_count vs dict_atom_non_h_count local_res_atom_non_h_electron_sum vs dict_atom_non_h_electron_sum

#Atom vs Atom
atom_vs_atom <- only50class %>% mutate(Difference = abs(local_res_atom_non_h_count-dict_atom_non_h_count)) %>%
  group_by(Difference) %>% arrange(desc(Difference)) %>% select (res_name,Difference,local_res_atom_non_h_count,dict_atom_non_h_count)

prettyTable(head(atom_vs_atom,10))
#Electron vs Electron
electron_vs_electron <- only50class %>% 
  mutate(Difference = abs(local_res_atom_non_h_electron_sum-dict_atom_non_h_electron_sum)) %>%
  group_by(Difference) %>% arrange(desc(Difference)) %>% select (res_name,Difference,local_res_atom_non_h_electron_sum,dict_atom_non_h_electron_sum)

prettyTable(head(electron_vs_electron,10))